package org.huangrui.javase.api;

import org.junit.Test;

/**
 * @Author hr
 * @Create 2025-11-07 12:29
 **/
public class T08StringIntern {
    @Test
    public void test1(){
        String s1 = new String("尚硅谷");
        /*
        这句代码有2个字符串对象，一个是"尚硅谷"，一个是新new的，s1引用的是新对象的地址
        "尚硅谷"在常量池，新new的不在常量池
         */
        String s2 = s1.intern();
        /*
        s1的intern()在池中找s1.equals(池中字符串)返回true的字符串，
        如果可以找到，返回该对象地址，没找到，将s1字符串地址放入常量池
        这里池中有"尚硅谷"，可以找到，返回"尚硅谷"地址
         */
        String s3 = "尚硅谷";
        /*
        引用池中"尚硅谷"对象地址
         */
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
         /*
        JDK17：false,false,true
        JDK6：false,false,true
         */
    }

    @Test
    public void test2(){
        String s1 = "尚".concat("硅谷");
        /*
        这句代码有3个字符串对象，(1)"he" (2)"llo" (3) 新new字符串，内容是尚硅谷
        s1指向新new的字符串地址
         */
        String s2 = s1.intern();
        /*s1的intern()在池中找s1.equals(池中字符串)返回true的字符串，
        如果可以找到，返回该对象地址，没找到，将s1字符串地址放入常量池
        这里池中没有"尚硅谷"，将s1字符串地址放入池中
        */
        String s3 = "尚硅谷";
        /*
        直接用池中内容为尚硅谷的字符串地址
         */
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
         /*
        JDK17：true,true,true
        JDK6：false,false,true
         */
    }
}
